package com.sunday.member.http;

import com.sunday.common.model.ResultDO;
import com.sunday.member.entity.RechargeItem;
import com.sunday.member.entity.UploadImage;
import com.sunday.member.entity.Version;

import com.sunday.member.entity.addr.Address;
import com.sunday.member.entity.IndexData;
import com.sunday.member.entity.Member;
import com.sunday.member.entity.addr.City;
import com.sunday.member.entity.order.OrderConfirm;
import com.sunday.member.entity.order.OrderItem;
import com.sunday.member.entity.order.PrePayResult;
import com.sunday.member.entity.product.CollectionProduct;
import com.sunday.member.entity.product.Product;
import com.sunday.member.entity.product.ProductCategory;
import com.sunday.member.entity.product.ProductDetail;

import java.util.List;

import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;


/**
 * Created by 刘涛 on 2017/5/24.
 * <p>
 * 公用接口
 */

public interface MemberService {

    /**
     * 【用户版和管理版】用户登陆。手机号和密码。-1直接提示消息
     *
     * @param loginType 1用户版，2管理版
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/member/login")
    Call<ResultDO<Member>> login(@Field("mobile") String mobile, @Field("password") String password, @Field("loginType") int loginType);

    /**
     * 首页数据
     *
     * @param
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/common/getIndexData")
    Call<ResultDO<IndexData>> getIndexData(@Field("villageId") Integer villageId, @Field("nonce") String nonce,
                                           @Field("sign") String sign);

    /**
     * 【用户版和管理版】获取商品分类（树形结构）。
     *
     * @param categoryId 一级分类ID。从首页直接进入分类，回头会根据此ID，选中对应的一级分类。标识字段：isCheck 0未选择，1已选择
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/product/category/getTree")
    Call<ResultDO<List<ProductCategory>>> getProductTree(@Field("categoryId") Integer categoryId, @Field("nonce") String nonce,
                                                         @Field("sign") String sign);


    /**
     * 获取商品列表。分页
     *
     * @param type       商品类型。1商城商品。2积分商品，3采购商品
     * @param categoryId 一级分类ID。从首页直接进入分类，回头会根据此ID，选中对应的一级分类。标识字段：isCheck 0未选择，1已选择
     * @param sort       排序参数。字段名称。默认为空。销量：saleNumber,价格：price
     * @param order      排序参数。默认为空。ASC正序/DESC倒序
     */

    @FormUrlEncoded
    @POST("/sunday/mobile/product/select")
    Call<ResultDO<List<ProductDetail>>> getProductList(@Field("name") String name, @Field("categoryId") Integer categoryId,
                                                       @Field("type") int type, @Field("villageId") Integer villageId,
                                                       @Field("pageSize") int pageSize, @Field("pageNumber") int pageNumber,
                                                       @Field("sort") String sort, @Field("order") String order,
                                                       @Field("nonce") String nonce, @Field("sign") String sign);


    /**
     * 商品详情
     *
     * @param
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/product/findOne")
    Call<ResultDO<ProductDetail>> getProductDetail(@Field("productId") long productId, @Field("villageId") Integer villageId, @Field("nonce") String nonce,
                                                   @Field("sign") String sign);

    /**
     * 【用户版和管理版】收藏或者取消收藏
     *
     * @param type    收藏类型 1商品，2菜谱，3资讯
     * @param otherId 被收藏（商品，菜谱，资讯）的id
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/collection/save")
    Call<ResultDO> doCollection(@Field("type") String type, @Field("otherId") String otherId, @Field("nonce") String nonce,
                                @Field("sign") String sign);


    /**
     * 【用户版和管理版】获取收藏的物品。商品，菜谱，资讯。都要分页
     *
     * @param type  收藏类型 1商品，2菜谱，3资讯
     * @param sort  排序参数。字段名称。默认为空
     * @param order 排序参数。。默认为空。ASC正序/DESC倒序
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/collection/select")
    Call<ResultDO<List<CollectionProduct>>> getCollection(@Field("type") String type, @Field("pageSize") int pageSize, @Field("pageNumber") int pageNumber,
                                                          @Field("sort") String sort, @Field("order") String order,
                                                          @Field("nonce") String nonce, @Field("sign") String sign);


    /**
     * 【用户版和管理版】加入购物车（支持批量新增）。商品ID集合和数量集合，需要对应。
     *
     * @param
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/cart/addCart")
    Call<ResultDO> addCart(@Field("villageId") Integer villageId, @Field("productIds") String productIds, @Field("nums") String nums,
                           @Field("nonce") String nonce, @Field("sign") String sign);

    /**
     * 【用户版和管理版】立即购买结算（确认订单）。如果使用了优惠券，余额，或切换了配送方式。请重新调用接口加载数据
     *
     * @param
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/count/countBuyNow")
    Call<ResultDO<OrderConfirm>> countBuyNow(@Field("productId") long productId, @Field("number") int number, @Field("villageId") Integer villageId,
                                             @Field("isUsedBalance") int isUsedBalance, @Field("couponId") int couponId, @Field("nonce") String nonce,
                                             @Field("sign") String sign);


    /**
     * 【用户版和管理版】查找当前用户所有收货地址（也是获取用户的小区*****）。不分页
     *
     * @param
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/address/select")
    Call<ResultDO<List<Address>>> getAddrList(@Field("nonce") String nonce,
                                              @Field("sign") String sign);

    /**
     * 【用户版和管理版】设置当前地址为默认地址
     *
     * @param
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/address/setDefault")
    Call<ResultDO> setDefaultAddr(@Field("addressId") int addressId, @Field("nonce") String nonce,
                                  @Field("sign") String sign);


    /**
     * 【用户版和管理版】删除地址
     *
     * @param
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/address/delete")
    Call<ResultDO> delAddr(@Field("addressId") int addressId,@Field("nonce") String nonce,
                           @Field("sign") String sign);

    /**
     * 【用户版和管理版】保存新增或更新用户地址
     * <p>
     * 省ID。管理版传入
     * provinceName
     * 省名称。管理版传入
     * cityId
     * 市ID。管理版传入
     * cityName
     * 市名称。管理版传入
     * districtId
     * 区县ID。管理版传入
     * districtName
     * 区县名称。管理版传入
     * villageId	小区id。用户版传入
     *
     * @param
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/address/save")
    Call<ResultDO> saveAddr(@Field("id") int id, @Field("villageId") Integer villageId,
                            @Field("receiveName") String receiveName, @Field("receiveMobile") String receiveMobile,
                            @Field("provinceId") Integer provinceId, @Field("provinceName") String provinceName,
                            @Field("cityId") Integer cityId, @Field("cityName") String cityName,
                            @Field("districtId") Integer districtId, @Field("districtName") String districtName,
                            @Field("receiveAddress") String receiveAddress, @Field("nonce") String nonce,
                            @Field("sign") String sign);


    /**
     * 所有省份
     */
    @POST("/sunday/mobile/area/getProvince")
    Call<ResultDO<List<City>>> getProvinces();

    /**
     * 所有城市
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/area/getCity")
    Call<ResultDO<List<City>>> getCitys(@Field("provinceId") Integer provinceId);

    /**
     * 所有区县
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/area/getDistrict")
    Call<ResultDO<List<City>>> getDistricts(@Field("cityId") Integer cityId);

    /**
     * 创建订单
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/order/createOrder")
    Call<ResultDO<OrderItem>> createOrder(@Field("cartIds") String cartIds, @Field("sendType") Integer sendType,
                                      @Field("couponId") Integer couponId, @Field("isUsedBalance") Integer isUsedBalance,
                                      @Field("addressId") Integer addressId, @Field("villageId") Integer villageId,
                                      @Field("payPassword") String payPassword, @Field("remark") String remark,
                                      @Field("nonce") String nonce, @Field("sign") String sign);


    /**
     * 【用户版和管理版】分页获取订单
     *
     * @param type          订单类型。1,用户自己的商城订单，2用户自己的积分订单，3，门店/大客户自己的采购订单，4，门店的配送订单
     * @param orderStatuses 订单状态集合，支持传入多个状态。例如：orderStatuses=1,2,30全部，1，待付款，2待配送，3配送中，4待评价，
     *                      5已评价，6待退款， 7已退款，8待退货，9已退货
     * @param sort          排序参数。字段名称。默认为空
     * @param order         排序参数。。默认为空。ASC正序/DESC倒序
     * @param pageSize      分页参数。每页数量。默认20
     * @param pageNumber    分页参数。第几页。默认1
     *
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/order/select")
    Call<ResultDO<List<OrderItem>>> getOrderList(@Field("type") int type, @Field("orderStatuses") int orderStatuses,
                                                 @Field("pageSize") int pageSize, @Field("pageNumber") int pageNumber,
                                                 @Field("sort") String sort, @Field("order") String order,
                                                 @Field("nonce") String nonce, @Field("sign") String sign);

    /**
     * 【用户版和管理版】确认收货。配送中订单才能确认收货，不区分订单类型
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/order/confirmReceive ")
    Call<ResultDO> confirmReceive(@Field("orderId") long orderId, @Field("nonce") String nonce, @Field("sign") String sign);

    /**
     * 【用户版和管理版】取消订单。1用户商城订单，【待付款】才能取消，2用户积分订单，不能取消，3管理版【采购订单】待配送才能取消。
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/order/cancel")
    Call<ResultDO> cancelOrder(@Field("orderId") long orderId, @Field("nonce") String nonce, @Field("sign") String sign);


    /**
     * 【用户版和管理版】订单详情
     *
     * @param
     * @param
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/order/findOne")
    Call<ResultDO<OrderItem>> getOrderDetail(@Field("orderId") long orderId, @Field("nonce") String nonce, @Field("sign") String sign);


    /**
     * 【用户版和管理版】获取购物车。购物车ID集合参数说明：可传入此参数，核算购物车总价（如果系统含满减，多件折扣等促销）
     *
     * @param cartIds 购物车ID集合(非商品ID)。如：cardIds=1,2,3。可传入此参数，核算购物车总价（如系统含满减，多件折扣等促销）
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/cart/getCart")
    Call<ResultDO<OrderConfirm>> getCart(@Field("villageId") Integer villageId, @Field("cartIds") String cartIds,
                                         @Field("nonce") String nonce, @Field("sign") String sign);


    /**
     * 【用户版和管理版】修改购物车数量（支持批量修改）。商品ID集合和数量集合，需要对应。
     *
     * @param cartIds 购物车ID集合(非商品ID)。
     * @param nums    数量集合（修改后的数量），和购物车ID对应。如：numbers=1,2,3
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/cart/updateCart")
    Call<ResultDO> updateCart(@Field("villageId") Integer villageId, @Field("cartIds") String cartIds,
                              @Field("nums") String nums, @Field("nonce") String nonce, @Field("sign") String sign);

    /**
     * 【用户版和管理版】删除购物车（支持批量删除）。
     *
     * @param cartIds 购物车ID集合(非商品ID)。
     * @param
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/cart/deleteCart")
    Call<ResultDO> deleteCart(@Field("cartIds") String cartIds, @Field("nonce") String nonce, @Field("sign") String sign);


    /**
     * 【用户版和管理版】购物车结算（确认订单）。如果使用了优惠券，余额，或切换了配送方式。请重新调用接口加载数据
     *
     * @param cartIds 购物车ID集合(非商品ID)。
     * @param
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/count/countCart")
    Call<ResultDO<OrderConfirm>> countCart(@Field("cartIds") String cartIds, @Field("villageId") Integer villageId,
                                           @Field("isUsedBalance") int isUsedBalance, @Field("couponId") int couponId,
                                           @Field("nonce") String nonce, @Field("sign") String sign);


    /**
     * 【用户版和管理版】修改个人信息。-1直接提示消息；会返回新的token，记得更新移动端的token
     *
     * @param idCard 身份证号码
     * @param desc 个人简介
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/member/update")
    Call<ResultDO<Member>> updateUserInfo(@Field("nickName") String nickName, @Field("mobileName") String mobileName,
                                  @Field("address") String address, @Field("email") String email,
                                  @Field("image") String image, @Field("idCard") String idCard,
                                  @Field("desc") String desc, @Field("nonce") String nonce, @Field("sign") String sign);


    //版本更新
    @FormUrlEncoded
    @POST("/sunday/mobile/apk/getApkInfo")
    Call<ResultDO<Version>> checkVersion(@Field("type") Integer type, @Field("versionCode") int versionCode);

    /**
     * 多张图片上传
     */
    @Multipart
    @POST("/sunday/mobile/upload/uploadMulti")
    Call<ResultDO<List<UploadImage>>> uploadMulti(@Part("files") RequestBody body);


    /**
     * 单张图片上传
     */
    @Multipart
    @POST("/sunday/mobile/upload/uploadSingle")
    Call<ResultDO<UploadImage>> uploadSingle(@Part("file") RequestBody body);

    /**【用户版】预支付接口。请先创建订单后，再调用此接口
     *
     * @param type 支付类型。1，订单支付，2钱包充值
     * @param payType  支付方式。1，支付宝，2微信
     * @param orderIds  订单ID集合。以创建订单时返回的数据为准
     * @return
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/pay/preparePay")
    Call<ResultDO<PrePayResult>> preparePay(@Field("payType") int payType, @Field("orderIds") String orderIds,
                                            @Field("type")int type, @Field("nonce")String nonce, @Field("sign")String sign);


    /** 【用户版和管理版】钱包，获取充值产品。不分页
     *
     * @return
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/income/product/select")
    Call<ResultDO<List<RechargeItem>>> getRechargeList(@Field("nonce")String nonce, @Field("sign")String sign);

    /** 【用户版和管理版】钱包-充值-创建订单。单次只能购买一个充值产品
     *
     * @return
     */
    @FormUrlEncoded
    @POST("/kitchen/mobile/income/product/createOrder")
    Call<ResultDO<OrderItem>> createRechargeOrder(@Field("productId")int productId,@Field("nonce")String nonce, @Field("sign")String sign);

    /**
     * 推送 登录保存tokend
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/cid/upload")
    Call<ResultDO> upLoadClientId(@Field("type")String type,@Field("cid")String cid,@Field("nonce")String nonce,
                                  @Field("sign")String sign);

    /**
     * 【用户版和管理版】忘记密码。。-1直接提示消息；
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/member/forgetPassword")
    Call<ResultDO> forgetPassword(@Field("mobile")String mobile,@Field("newPassword")String newPassword,@Field("code")String code);


    /**
     * 验证验证码
     * @param type  验证码类型。1登陆（手机号加验证码登录），2注册，3修改密码，4忘记密码，5设置支付密码，6修改支付密码
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/code/check")
    Call<ResultDO<Member>> checkCode(@Field("mobile") String mobile, @Field("type") String type, @Field("code") String code);


    /**
     * 发送验证码
     *@param type  验证码类型。1登陆（手机号加验证码登录），2注册，3修改密码，4忘记密码，5设置支付密码，6修改支付密码
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/code/send")
    Call<ResultDO> sendCode(@Field("mobile") String mobile, @Field("type") String type, @Field("nonce") String nonce
            , @Field("sign") String sign);


    /**
     * 【用户版和管理版】修改密码。使用验证码修改。-1直接提示消息；
     *@param
     */
    @FormUrlEncoded
    @POST("/sunday/mobile/member/updatePasswordWithCode")
    Call<ResultDO> updatePwd(@Field("mobile") String mobile, @Field("newPassword") String newPassword,@Field("code")String code,@Field("nonce") String nonce
            , @Field("sign") String sign);


}
